﻿Imports DevComponents.Editors.DateTimeAdv
Imports DevComponents.DotNetBar.Controls
Imports DevComponents.Editors
Imports HTLibrary
Imports TNCBAL
Imports TNCDAL

Public Class ucFileInformation
    Private _ucFile As ucFile

    'Các đối tượng controller
    Private _objFileController As New FileController
    Private _objFileMBLController As New FileMBLController
    Private _objMBLController As New MBLController

    Private _objFile As tblFile
    Private _objMBL As tblMBL
    Private _objFileMBL As tblFileMBL

    Private _enumFile As enumFILE

    Private _action As enumAction ' Lưu lại hành động cho biết thêm hay sửa

    Public Sub New(ByVal uc As ucFile, ByVal eFILE As enumFILE)
        InitializeComponent()
        TextBoxHelper.TextBox_InitUpperStringEvent(Me.Controls)

        Dim alpha As Array = " ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToArray()
        cmbOrderAlpha.DataSource = alpha

        'TextBoxHelper.TextBox_InitNumberEvent(Me.Controls, New List(Of String)(New String() {txtRatio.Name}))
        _ucFile = uc
        VisibleEditFileNo(False)
        'InitCommands()
        If uc.ObjFile IsNot Nothing Then
            _objFile = _objFileController.SelectRecordById(_ucFile.ObjFile.ID_File)
            _objFile.ID_User = _ucFile.ObjFile.ID_User
            _objFile.CreatedDate = _ucFile.ObjFile.CreatedDate
        End If
        _enumFile = eFILE

        ' Nếu là hàng nhập đảo lại vị trí Combobox của Company và ForeignCompany
        If _enumFile = enumFILE.Import Then

            Dim loc = cmbCompany.Location
            Dim index = cmbCompany.TabIndex
            cmbCompany.Location = cmbForeignCompany.Location
            cmbCompany.TabIndex = cmbForeignCompany.TabIndex
            cmbForeignCompany.Location = loc
            cmbForeignCompany.TabIndex = index
        End If

        'Ẩn/Hiện những trường không dùng cho hàng nhập/hàng xuất
        GroupBoxFCL.Visible = Not _enumFile 'Nếu là hàng nhập thì hiện ra, hàng xuất thì ẩn đi vì hàng xuất chỉ dùng FCL
        txtLineBookingNo.Visible = _enumFile 'Nếu là hàng nhập thì ẩn đi
        lblLineBookingNo.Visible = _enumFile
        lblNoiHaCont.Visible = _enumFile
        cmbNoiHaCont.Visible = _enumFile
        lblNoiNangCont.Visible = _enumFile
        cmbNoiNangCont.Visible = _enumFile
    End Sub


    Private Sub ucFileInformation_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            FillAutoCompleteMBLNo()
        Catch ex As Exception
#If DEBUG Then
            Throw ex
#Else
            MessageBox.Show(ex.Message)
#End If
        End Try

    End Sub

    ''' <summary>
    ''' Load lại dữ liệu các danh mục, dữ liệu File
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub ReloadForm()
        InitFormData()
        LoadFileInfoData()
    End Sub


    ''' <summary>
    ''' Khởi tạo dữ liệu mặc định cho các control
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub InitFormData()
        'Dim dc As New TanNamChinhDataContext
        'Nên giữ nguyên thứ tự load combobox như sau: 1. ForeignCompany 2. Agent 3. Company 4. Customer
        'Company
        CViewer.BindingComboBox_Company(cmbCompany, _enumFile)

        'Foreign Company
        CViewer.BindingComboBox_ForeignCompany(cmbForeignCompany, _enumFile)

        '2. Danh sách Agent
        CViewer.BindingComboBox_Agent(cmbAgent)

        '4. Danh sách nhân viên khách hàng
        CViewer.BindingMultiColumnComboBox_Customer(cmbCustomer, _enumFile, cmbCompany.Width)

        '5. Nơi hạ cont (lấy cont)
        CViewer.BindingComboBox_VietNamPort(cmbNoiHaCont)

        '6. Nơi nâng cont (trả cont)
        CViewer.BindingComboBox_VietNamPort(cmbNoiNangCont)

        ''7. Other Currency
        'CViewer.BindingComboBox_OtherCurrency(cmbCurrency)

        'Khởi tạo dữ liệu MBL
        InitMBLData()
    End Sub

    ''' <summary>
    ''' Reset toàn bộ control về trạng thái ban đầu 
    ''' trước khi thêm mới hoặc load dữ liệu
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub ResetControls()
        CViewer.ResetControls(Me.Controls)
        OrderNumIntegerInput.Value = _objFileController.GetNewOrderNum(_enumFile)
        reflectionLabelFileNo.Text = FormatFileNo(OrderNumIntegerInput.Value.ToString())
        'cmbCurrency.SelectedIndex = 0
        rbtnCY2CY.Checked = True
        rbtnFCL.Checked = True
    End Sub

    ''' <summary>
    ''' Load thông tin Lô hàng vào form
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub LoadFileInfoData()
        Try
            ResetControls()
            'Nếu là cập nhật Lô hàng
            If _objFile IsNot Nothing Then
                With _objFile
                    'Nếu là tạo file từ Booking thì FileNo là Nothing
                    If .FileNo IsNot Nothing Then
                        Try
                            OrderNumIntegerInput.Value = .OrderNum
                        Catch ex As Exception

                        End Try

                        Try
                            cmbOrderAlpha.Text = .OrderAlpha
                        Catch ex As Exception
                            cmbOrderAlpha.Text = ""
                        End Try

                        reflectionLabelFileNo.Text = FormatFileNo(.FileNo)  'String.Format("<b><font size=""+4""><font color=""#1F497D"">{0}</font></font></b>", _.FileNo)
                    Else
                        OrderNumIntegerInput.Value = _objFileController.GetNewOrderNum(_enumFile)
                        reflectionLabelFileNo.Text = FormatFileNo(OrderNumIntegerInput.Value.ToString()) 'String.Format("<b><font size=""+4""><font color=""#1F497D"">{0}</font></font></b>", _objFileController.GetNewOrderNum(_enumFile).ToString())
                    End If

                    Try
                        cmbTerm.Text = .Term 'IIf(.Term IsNot Nothing, .Term, String.Empty)
                    Catch ex As Exception
                        cmbTerm.Text = ""
                        cmbTerm.SelectedIndex = -1
                    End Try

                    txtLineBookingNo.Text = IIf(.LineBookingNo IsNot Nothing, .LineBookingNo, String.Empty)

                    rbtnD2D.Checked = .IsD2D
                    rbtnCY2CY.Checked = Not rbtnD2D.Checked

                    rbtnFCL.Checked = .IsFCL
                    rbtnLCL.Checked = Not rbtnFCL.Checked

                    Try
                        cmbCustomer.SelectedValue = .ID_Customer
                    Catch ex As Exception
                        cmbCustomer.Text = ""
                        cmbCustomer.SelectedIndex = -1
                    End Try

                    Try
                        cmbCompany.SelectedValue = .ID_Company
                    Catch ex As Exception
                        cmbCompany.Text = ""
                        cmbCompany.SelectedIndex = -1
                    End Try

                    Try
                        cmbForeignCompany.SelectedValue = .ID_ForeignCompany
                    Catch ex As Exception
                        cmbForeignCompany.Text = ""
                        cmbForeignCompany.SelectedIndex = -1
                    End Try

                    Try
                        cmbAgent.SelectedValue = .ID_Agent
                    Catch ex As Exception
                        cmbAgent.Text = ""
                        cmbAgent.SelectedIndex = -1
                    End Try

                    'Nơi hạ cont (Nơi lấy cont)
                    Try
                        cmbNoiHaCont.SelectedValue = .ID_PortGetCont
                    Catch ex As Exception
                        cmbNoiHaCont.Text = ""
                        cmbNoiHaCont.SelectedIndex = -1
                    End Try

                    'Nơi nâng cont (Nơi trả cont)
                    Try
                        cmbNoiNangCont.SelectedValue = .ID_Port2
                    Catch ex As Exception
                        cmbNoiNangCont.Text = ""
                        cmbNoiNangCont.SelectedIndex = -1
                    End Try
                End With

                '==========================================
                'Load FileMBL và MBL nếu tồn tại
                _objFileMBL = _objFileMBLController.GetMBLByFile(_objFile.ID_File)
                If _objFileMBL IsNot Nothing Then
                    'Hiển thị thông tin chi tiết của FileMBL trên form
                    _objMBL = _objFileMBL.tblMBL
                    'Load dữ liệu MBL lên form
                    LoadFileMBLDetails(_objMBL)
                End If
            End If


        Catch ex As Exception
#If DEBUG Then
            Throw ex
#Else
            MessageBox.Show(ex.Message)
#End If

        End Try
    End Sub

    ''' <summary>
    ''' Cập nhật thông tin trên form vào object
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub GetFileInfoByForm()
        With _objFile
            .IsExport = _enumFile
            .OrderNum = OrderNumIntegerInput.Value
            .OrderAlpha = cmbOrderAlpha.Text
            'If txtFileNo.Text <> "" Then
            '    .FileNo = Integer.Parse(txtFileNo.Text) 'fileNo 'lblFileNo.Text.ToUpper()
            'End If
            .IsD2D = rbtnD2D.Checked
            .IsFCL = rbtnFCL.Checked
            .Term = cmbTerm.Text
            Try
                .ID_Company = cmbCompany.SelectedValue
            Catch ex As Exception
                .tblCompany = cmbCompany.SelectedItem
            End Try

            Try
                .ID_Customer = cmbCustomer.SelectedValue
            Catch ex As Exception
                Dim objCustomerController As New CustomerController
                .tblCustomer = objCustomerController.SelectRecordById(cmbCustomer.SelectedValue)
            End Try

            Try
                .ID_Agent = cmbAgent.SelectedValue
            Catch ex As Exception
                .tblAgent = cmbAgent.SelectedItem
            End Try

            Try
                .ID_ForeignCompany = cmbForeignCompany.SelectedValue
            Catch ex As Exception
                .tblForeignCompany = cmbForeignCompany.SelectedItem
            End Try

            .LineBookingNo = txtLineBookingNo.Text.ToUpper()
            Try
                .ID_PortGetCont = cmbNoiHaCont.SelectedValue
            Catch ex As Exception
                .tblPort1 = cmbNoiHaCont.SelectedItem
            End Try

            Try
                .ID_Port2 = cmbNoiNangCont.SelectedValue
            Catch ex As Exception
                .tblPort1 = cmbNoiNangCont.SelectedItem
            End Try

            'Lưu thông tin hệ thống
            If .ID_User Is Nothing Then
                .ID_User = GeneralClassBAL._User.ID_User
            End If

            If .CreatedDate Is Nothing Then
                .CreatedDate = DateTime.Now
            End If

            If .Status Is Nothing Then
                .Status = 0
            End If
        End With
    End Sub

#Region "Commands"
    ''' <summary>
    ''' Tạo mới MBL
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub CreateNewMBL()
        _objMBL = New tblMBL 'Khởi tạo MBL
        _objMBL.tblVoyage = New tblVoyage() 'Khởi tạo tblVoyage trong tblMBL

        'Lấy thông tin nhập liệu trên form lưu vào
        GetMBLInfoByForm()

        'Tạo mới MBL và lấy ID_MBL sau khi tạo mới
        _objMBL = _objMBLController.Insert(_objMBL)
    End Sub

    Private Function FormatFileNo(ByVal fileNo As String) As String
        Dim value As String
        If _enumFile Then
            value = "EX"
        Else
            value = "IM"
        End If
        value = String.Format("<b><font size=""+4""><font color=""#1F497D"">{0}/{1}</font></font></b>", fileNo, value)
        Return value
    End Function

    Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click
        ErrorProvider1.Clear()
        'Kiểm tra tính hợp lệ của việc nhập dữ liệu ở FileMBL
        If Not Me.ValidateChildren(ValidationConstraints.Enabled) Then
            '_ucCommands.EnableButtons(True)
            Exit Sub
        End If

        Try
            ErrorProvider1.Clear()
            'Nếu là thêm mới
            If _objFile Is Nothing Then
                'Cho biết hành động thêm mới lô hàng
                _action = enumAction.Add

                '=============================================================
                '1. Tạo mới File
                _objFile = New tblFile 'Khởi tạo object File
                'Lấy thông tin nhập liệu trên form lưu vào
                GetFileInfoByForm()
                'Lưu vào CSDL
                _objFile = _objFileController.Insert(_objFile)
                reflectionLabelFileNo.Text = FormatFileNo(_objFile.FileNo) 'String.Format("<b><font size=""+4""><font color=""#1F497D"">{0}</font></font></b>", _objFile.FileNo)
                '=============================================================
                '1. Kiểm tra MBL tồn tại?
                If _objMBL Is Nothing Then 'Nếu MBL không tồn tại thì tạo mới
                    'Tạo mới MBL
                    CreateNewMBL()
                End If

                '=============================================================
                'Tạo mới FileMBL
                _objFileMBL = New tblFileMBL
                _objFileMBL.ID_File = _objFile.ID_File
                _objFileMBL.ID_MBL = _objMBL.ID_MBL
                _objFileMBLController.Insert(_objFileMBL)

                '=============================================================
                'Kiểm tra nếu sau khi thêm mới nếu FileNo trong CSDL <> FileNo trong form thì update lại FileNo trên form
                'If _objFile.FileNo <> Integer.Parse(lblFileNo.Text) Then
                '    'Reload data after update
                '    lblFileNo.Text = _objFile.FileNo.ToString()
                'End If
                'Cập nhật lại title hiển thị theo FileNo
                _ucFile.ObjFile = _objFile
                _ucFile.UpdateTitle()

            Else 'Nếu là cập nhật
                'Cho biết hành động cập nhật lô hàng
                _action = enumAction.Edit

                '=============================================================
                '1. Tạo mới File
                'Lấy thông tin nhập liệu trên form lưu vào
                GetFileInfoByForm()
                'Lưu vào CSDL
                _objFileController.Update(_objFile)


                '=============================================================
                'Kiểm tra _objMBL "new" có tồn tại?
                If _objMBL IsNot Nothing Then 'Nếu _objMBL "new" tồn tại thì cập nhật
                    'Kiểm tra Voyage đã tồn tại chưa
                    If _objMBL.tblVoyage Is Nothing Then
                        _objMBL.tblVoyage = New tblVoyage()
                    End If

                    'Cập nhật thông tin của MBL
                    GetMBLInfoByForm()

                    _objMBLController.Update(_objMBL)
                Else 'Nếu _objMBL "new" không tồn tại thì tạo mới
                    'Tạo mới MBL
                    CreateNewMBL()
                End If


                '=============================================================
                'Cập nhật FileMBL
                'If _objFile.tblFileMBLs.Count > 0 Then 'Kiểm tra đã tồn tại FileMBL chưa
                If _objFileMBL IsNot Nothing Then 'Kiểm tra đã tồn tại FileMBL chưa
                    If _objFileMBL.tblMBL.ID_MBL <> _objMBL.ID_MBL Then 'Kiểm tra ID_MBL của FileMBL có khác với ID_MBL mới chỉnh sửa không
                        '_objFileMBL.ID_MBL = _objMBL.ID_MBL
                        _objFileMBL.tblMBL = _objMBL
                        '_objFile.tblFileMBLs(0).ID_MBL = _objMBL.ID_MBL
                        _objFileMBLController.Update(_objFileMBL)
                    End If
                Else 'Nếu chưa thì tạo mới
                    'Tạo mới FileMBL
                    _objFileMBL = New tblFileMBL
                    _objFileMBL.ID_File = _objFile.ID_File
                    _objFileMBL.ID_MBL = _objMBL.ID_MBL
                    _objFileMBLController.Insert(_objFileMBL)
                End If

                '=============================================================
                'Xóa MBL "old" đi nếu không dùng
                'Kiểm tra xem MBL "new" có khác với MBL "old" không?
                If _objMBL.ID_MBL <> _objFileMBL.tblMBL.ID_MBL Then
                    'Kiểm tra MBL "old" đang dùng ở File khác. Nếu không dùng thì xóa MBL "old" đi
                    _objMBLController.RemoveMBLByFile(_objFile.ID_File, _objFileMBL.tblMBL)
                End If
            End If
            '======================
            'Reload lại sau khi cập nhật (kiểm tra xem giá trị nào chưa thực sự nhập)
            LoadFileInfoData()

            '====================================================
            'Write log
            Dim objLogController As New LogController
            objLogController.Insert(_action, String.Format("File {0}", _objFile.FileNo))

            '====================================================
            'Sau khi cập nhật xong thì Refresh lại form ucFile để enable các chức năng bị disable
            _ucFile.FillFormHeader(_objFile.ID_File)
        Catch ex As Exception
#If DEBUG Then
            Throw ex
#Else
            MessageBox.Show(ex.Message)
#End If
        Finally
            VisibleEditFileNo(False)
            MessageBox.Show("Update successful!")
        End Try
    End Sub

    Private Sub btnRefresh_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRefresh.Click
        ReloadForm()
    End Sub
#End Region

#Region "FileMBL"
    Private Sub FillAutoCompleteMBLNo()
        'Load danh sách MBL No. thỏa điều kiện lọc để làm auto complete
        Dim objMBLController As New MBLController
        Dim remainMbl As IQueryable(Of tblMBL)
        If _objFile IsNot Nothing Then
            remainMbl = objMBLController.GetRemainMBLList(_enumFile, _objFile.ID_File)
        Else
            remainMbl = objMBLController.GetRemainMBLList(_enumFile, -1)
        End If

        'Auto complete
        Dim source = New AutoCompleteStringCollection()
        Dim mblNoList = From p In remainMbl.AsQueryable()
                        Select p.MBLNo
        source.AddRange(mblNoList.ToArray())
        'source.AddRange(New String() {"HA", "HG"}) 'Test data
        'Textbox MBLNo
        txtMBLNo.AutoCompleteSource = AutoCompleteSource.CustomSource
        txtMBLNo.AutoCompleteCustomSource = source
        txtMBLNo.AutoCompleteMode = AutoCompleteMode.SuggestAppend
    End Sub

    ''' <summary>
    ''' Khởi tạo dữ liệu mặc định trên form
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub InitMBLData()
        'Nếu là hàng xuất thì POL là các cảng Việt Nam, POD là các cảng nước ngoài
        If _enumFile = enumFILE.Export Then
            'POL
            CViewer.BindingComboBox_VietNamPort(cmbPOL)
            'POD
            CViewer.BindingComboBox_ForeignPort(cmbPOD)
        Else 'Nếu là hàng nhập thì POL là các cảng nước ngoài ,POD là các cảng Việt Nam
            'POL
            CViewer.BindingComboBox_ForeignPort(cmbPOL)
            'POD
            CViewer.BindingComboBox_VietNamPort(cmbPOD)
        End If

        'TransshipmentPort
        CViewer.BindingComboBox_ForeignPort(cmbTransshipmentPort)
        'Line
        CViewer.BindingComboBox_Line(cmbLine)
        'Vessel
        CViewer.BindingComboBox_Vessel(cmbVessel)
    End Sub

    ''' <summary>
    ''' Lưu thông tin hiển thị trên form vào các object cụ thể
    ''' Kiểm tra nếu chưa có thì tạo mới FileMBL rồi tạo mới MBL và Voyage của MBL
    ''' Nếu tồn tại rồi thì cập nhật chỉ các giá trị chỉnh sửa trên form
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub GetMBLInfoByForm()
        _objMBL.MBLNo = txtMBLNo.Text.ToUpper()
        _objMBL.tblVoyage.VoyageNo = txtVoyageNo.Text.ToUpper()
        Try
            _objMBL.tblVoyage.ID_Line = cmbLine.SelectedValue
        Catch ex As Exception
            _objMBL.tblVoyage.tblLine = cmbLine.SelectedItem
        End Try

        Try
            _objMBL.tblVoyage.ID_Vessel = cmbVessel.SelectedValue
        Catch ex As Exception
            _objMBL.tblVoyage.tblVessel = cmbVessel.SelectedItem
        End Try

        Try
            _objMBL.tblVoyage.ID_POD = cmbPOD.SelectedValue
        Catch ex As Exception
            _objMBL.tblVoyage.tblPort = cmbPOD.SelectedItem
        End Try

        Try
            _objMBL.tblVoyage.ID_POL = cmbPOL.SelectedValue
        Catch ex As Exception
            _objMBL.tblVoyage.tblPort1 = cmbPOL.SelectedItem
        End Try

        Try
            _objMBL.tblVoyage.ID_MiddlePort = cmbTransshipmentPort.SelectedValue
        Catch ex As Exception
            _objMBL.tblVoyage.tblPort2 = cmbTransshipmentPort.SelectedItem
        End Try

        Try
            'Nếu không phải ngày thì gán null
            If dtETDDate.Value = "#12:00:00 AM#" Then
                _objMBL.tblVoyage.ETD = Nothing
            Else
                _objMBL.tblVoyage.ETD = dtETDDate.Value.ToShortDateString + " " + dtETDTime.Value.ToShortTimeString
            End If
        Catch ex As Exception
            _objMBL.tblVoyage.ETD = Nothing
        End Try

        Try
            'If Not DateTime.TryParse(dtETADate.Value.ToShortDateString + " " + dtETATime.Value.ToShortTimeString, _objMBL.tblVoyage.ETA) Then
            '    _objMBL.tblVoyage.ETA = Nothing
            'End If
            If dtETADate.Value = "#12:00:00 AM#" Then
                _objMBL.tblVoyage.ETA = Nothing
            Else
                _objMBL.tblVoyage.ETA = dtETADate.Value.ToShortDateString + " " + dtETATime.Value.ToShortTimeString
            End If
        Catch ex As Exception
            _objMBL.tblVoyage.ETA = Nothing
        End Try

    End Sub

    ''' <summary>
    ''' Hiển thị chi tiết FileMBL trên form
    ''' </summary>
    ''' <param name="objMBL"></param>
    ''' <remarks></remarks>
    Private Sub LoadFileMBLDetails(ByVal objMBL As tblMBL)
        Try
            If objMBL IsNot Nothing Then
                txtMBLNo.Text = objMBL.MBLNo
                'Hiển thị Line
                Try
                    cmbLine.SelectedValue = objMBL.tblVoyage.ID_Line
                Catch ex As Exception
                    cmbLine.SelectedIndex = -1
                End Try

                'Hiển thị Vessel
                Try
                    cmbVessel.SelectedValue = objMBL.tblVoyage.ID_Vessel
                Catch ex As Exception
                    cmbVessel.SelectedIndex = -1
                End Try

                'Hiển thị Voyage
                LoadVoyageDetails(objMBL.tblVoyage)
            End If
        Catch ex As Exception
#If DEBUG Then
            Throw ex
#Else
            MessageBox.Show("Lỗi load thông tin MBL")
#End If
        End Try
    End Sub

    ''' <summary>
    ''' Load thông tin Voyage vào form
    ''' </summary>
    ''' <param name="objVoyage"></param>
    ''' <remarks></remarks>
    Private Sub LoadVoyageDetails(ByVal objVoyage As tblVoyage)
        Try
            If objVoyage IsNot Nothing Then
                txtVoyageNo.Text = objVoyage.VoyageNo
                Try
                    cmbPOL.SelectedValue = objVoyage.ID_POL
                Catch ex As Exception
                    cmbPOL.Text = ""
                    cmbPOL.SelectedIndex = -1
                End Try

                Try
                    cmbPOD.SelectedValue = objVoyage.ID_POD
                Catch ex As Exception
                    cmbPOD.Text = ""
                    cmbPOD.SelectedValue = -1
                End Try

                Try
                    cmbTransshipmentPort.SelectedValue = objVoyage.ID_MiddlePort
                Catch ex As Exception
                    cmbTransshipmentPort.Text = ""
                    cmbTransshipmentPort.SelectedValue = -1
                End Try

                Try
                    dtETDDate.Value = objVoyage.ETD.Value.ToShortDateString
                Catch ex As Exception
                    dtETDDate.Value = Nothing
                End Try

                Try
                    dtETDTime.Value = objVoyage.ETD.Value.ToShortTimeString
                Catch ex As Exception
                    dtETDTime.Value = Nothing
                End Try

                Try
                    dtETADate.Value = objVoyage.ETA.Value.ToShortDateString
                Catch ex As Exception
                    dtETADate.Value = Nothing
                End Try

                Try
                    dtETATime.Value = objVoyage.ETA.Value.ToShortTimeString
                Catch ex As Exception
                    dtETATime.Value = Nothing
                End Try
            End If

        Catch ex As Exception
#If DEBUG Then
            Throw ex
#Else
            MessageBox.Show("Lỗi load thông tin Voyage")
#End If
        End Try

    End Sub
#End Region

    Private Sub txtMBLNo_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtMBLNo.Leave
        'Nếu đã nhập MBL No. vào textbox rồi
        If txtMBLNo.Text <> String.Empty Then
            _objMBL = _objMBLController.SelectMBLByMBLNo(txtMBLNo.Text)
            'Nếu tồn tại object MBL
            If _objMBL IsNot Nothing Then
                LoadFileMBLDetails(_objMBL)
            End If
        End If
    End Sub


#Region "Validating"

    'Private Sub txtRatio_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs)
    '    Dim cancel As Boolean = False
    '    If String.IsNullOrEmpty(txtRatio.Text) Then
    '        cancel = True
    '        Me.ErrorProvider1.SetError(txtRatio, "Chưa nhập tỉ giá!")
    '    Else
    '        Try
    '            Dim value As Double = Double.Parse(txtRatio.Text)
    '            If value < 0 Then
    '                cancel = True
    '                Me.ErrorProvider1.SetError(txtRatio, "Tỉ giá phải >= 0")
    '            End If
    '        Catch ex As Exception
    '            cancel = True
    '            Me.ErrorProvider1.SetError(txtRatio, "Tỉ giá này phải là giá trị số!")
    '        End Try
    '    End If

    '    If cancel = True Then
    '        txtRatio.Focus()
    '    End If

    '    e.Cancel = cancel
    'End Sub

    Private Sub txtVoyageNo_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtVoyageNo.Validating
        Dim cancel As Boolean = False
        'Nếu chưa tạo FileMBL (MBLNO = "") thì bỏ qua
        If txtMBLNo.Text <> "" Then
            'If txtVoyageNo.Text = "" Then
            '    Me.ErrorProvider1.SetError(txtVoyageNo, "Voyage No chưa có")
            '    cancel = True
            '    txtVoyageNo.Focus()
            'Else
            If cmbPOD.SelectedValue = cmbPOL.SelectedValue Then
                If cmbPOD.SelectedValue IsNot Nothing Then
                    Me.ErrorProvider1.SetError(cmbPOD, "POD và POL phải khác nhau")
                    cancel = True
                    dtETADate.Focus()
                End If
            Else
                'Nếu ETD chưa có giá trị mà ETA có thì báo lỗi
                If dtETDDate.Value = "#12:00:00 AM#" And dtETADate.Value <> "#12:00:00 AM#" Then
                    Me.ErrorProvider1.SetError(dtETDDate, "Ngày ETD phải trước ngày ETA")
                    cancel = True
                    dtETDDate.Focus()
                ElseIf dtETADate.Value <> "#12:00:00 AM#" And dtETDDate.Value <> "#12:00:00 AM#" Then 'Nếu ETD có giá trị 
                    If dtETDDate.Value > dtETADate.Value Then
                        Me.ErrorProvider1.SetError(dtETADate, "Ngày ETA phải sau ngày ETD")
                        cancel = True
                        dtETADate.Focus()
                    End If
                End If
            End If
            'End If
        End If


        e.Cancel = cancel
    End Sub

    Private Sub txtMBLNo_Validating(ByVal sender As System.Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtMBLNo.Validating
        Dim cancel As Boolean = False
        Try

            'Nếu đã nhập MBL No. vào textbox rồi
            If txtMBLNo.Text <> String.Empty Then
                _objMBL = _objMBLController.SelectMBLByMBLNo(txtMBLNo.Text)
                Dim id_file As Integer = -1
                If _objFile IsNot Nothing Then
                    id_file = _objFile.ID_File
                End If

                ''Nếu tồn tại object MBL
                'If _objMBL IsNot Nothing Then
                '    Dim query = From p In GeneralClassDAL.dc.tblFileMBLs
                '                Where p.ID_MBL = _objMBL.ID_MBL And p.ID_File <> id_file
                '                Select p
                '    If query.Count > 0 Then
                '        Me.ErrorProvider1.SetError(txtMBLNo, "MBL No này đã tồn tại")
                '        cancel = True
                '        txtMBLNo.Focus()
                '    End If

                'End If
            End If

        Catch ex As Exception
            MessageBox.Show("Error Validating in MBLNo")
        End Try
        e.Cancel = cancel
    End Sub


#End Region



    Private Sub dtETDDate_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles dtETDDate.KeyDown, dtETDTime.KeyDown, dtETADate.KeyDown, dtETATime.KeyDown
        If e.KeyCode = Keys.Delete Then
            CType(sender, DevComponents.Editors.DateTimeAdv.DateTimeInput).Value = Nothing
        End If
    End Sub

#Region "Fix Auto Complete"
    Private Sub cmbCompany_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbCompany.Leave
        If cmbCompany.Text <> "" Then
            Dim objComController As New CompanyController
            Try
                cmbCompany.SelectedValue = objComController.SelectRecordByName(cmbCompany.Text).ID_Company
            Catch ex As Exception
                cmbCompany.Text = ""
            End Try
        End If
    End Sub

    Private Sub cmbAgent_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbAgent.Leave
        If cmbAgent.Text <> "" Then
            Dim objAgentRepository As New AgentRepository
            Try
                Dim objAgent = New CAgent()
                cmbAgent.SelectedValue = objAgent.SelectRecordByName(cmbAgent.Text).ID_Agent
            Catch ex As Exception
                cmbAgent.Text = ""
            End Try
        End If
    End Sub

    Private Sub cmbForeignCompany_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbForeignCompany.Leave
        If cmbForeignCompany.Text <> "" Then
            Dim objForeignCompanyRepository As New CForeignCompany
            Try
                cmbForeignCompany.SelectedValue = objForeignCompanyRepository.SelectRecordByName(cmbForeignCompany.Text, _enumFile).ID_ForeignCompany
            Catch ex As Exception
                cmbForeignCompany.Text = ""
            End Try
        End If
    End Sub

    Private Sub cmbPort_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbNoiHaCont.Leave, cmbNoiNangCont.Leave, cmbPOD.Leave, cmbPOL.Leave, cmbTransshipmentPort.Leave
        Dim cmb As ComboBoxEx = CType(sender, ComboBoxEx)
        If cmb.Text <> "" Then
            Try
                'cmb.SelectedValue = GeneralClassDAL.dc.tblPorts.SingleOrDefault(Function(p As tblPort) p.Port = cmb.Text And p.IsActive = True).ID_Port
                Dim objPort As New CPortController()
                cmb.SelectedValue = objPort.SelectRecordByName(cmb.Text).ID_Port
            Catch ex As Exception
                cmb.Text = ""
            End Try
        End If
    End Sub

    Private Sub cmbLine_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbLine.Leave
        If cmbLine.Text <> "" Then
            Try
                'cmbLine.SelectedValue = GeneralClassDAL.dc.tblLines.SingleOrDefault(Function(p As tblLine) p.LineName = cmbLine.Text).ID_Line ' And p.IsActive = True
                Dim objLine = New CLine()
                cmbLine.SelectedValue = objLine.SelectRecordByName(cmbLine.Text).ID_Line
            Catch ex As Exception
                cmbLine.Text = ""
            End Try
        End If
    End Sub

    Private Sub cmbVessel_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbVessel.Leave
        If cmbVessel.Text <> "" Then
            Try
                'cmbVessel.SelectedValue = GeneralClassDAL.dc.tblVessels.SingleOrDefault(Function(p As tblVessel) p.VesselName = cmbVessel.Text).ID_Vessel ' And p.IsActive = True
                Dim objVessel = New CVessel()
                cmbVessel.SelectedValue = objVessel.SelectRecordByName(cmbVessel.Text).ID_Vessel
            Catch ex As Exception
                cmbVessel.Text = ""
            End Try
        End If
    End Sub

    'Private Sub cmbCustomer_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs)
    '    If cmbCustomer.Text <> "" Then
    '        Try
    '            Dim index = cmbCustomer.Text.IndexOf(CUSTOMER_STR)
    '            Dim cusName As String = cmbCustomer.Text.Substring(0, index)
    '            Dim comName As String = cmbCustomer.Text.Replace(cusName + CUSTOMER_STR, "")
    '            Dim objCustomerController = New CustomerController()
    '            cmbCustomer.SelectedValue = objCustomerController.SelectRecordByName(_enumFile, comName, cusName).ID_Customer
    '        Catch ex As Exception
    '            cmbCustomer.Text = ""
    '        End Try
    '    End If
    'End Sub
#End Region

    Private Sub txtMBLNo_Validated(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtVoyageNo.Validated, txtMBLNo.Validated
        ErrorProvider1.SetError(sender, "")
    End Sub


    Private Sub cmbTerm_Leave(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbTerm.Leave, cmbOrderAlpha.Leave
        If cmbTerm.Text <> "" Then
            Dim result As Boolean = False
            Try
                For Each value As ComboItem In cmbTerm.Items
                    If value.Text = cmbTerm.Text Then
                        result = True
                    End If
                Next

                If Not result Then
                    cmbTerm.Text = ""
                End If
            Catch ex As Exception
                cmbTerm.Text = ""
            End Try
        End If
    End Sub

    Public Sub VisibleEditFileNo(ByVal value As Boolean)
        lblFileNoEdit.Visible = value
        OrderNumIntegerInput.Visible = value
        cmbOrderAlpha.Visible = value
        btnUpdateFileNo.Visible = value
    End Sub

    Private isUpdateFileNo As Boolean = False 'Cho biết trạng thái đang update FileNo hay không
    Private Sub LinkLabelEditFileNo_LinkClicked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabelEditFileNo.LinkClicked
        isUpdateFileNo = Not isUpdateFileNo
        'Nếu đang ở tình trạng update FileNo
        If isUpdateFileNo Then
            LinkLabelEditFileNo.Text = "Cancel Edit"
            VisibleEditFileNo(True)
            ''Nếu là đang tạo mới File
            'If _objFile IsNot Nothing Then
            '    txtFileNo.Text = _objFile.FileNo
            'End If
        Else
            LinkLabelEditFileNo.Text = "Edit FileNo"
            VisibleEditFileNo(False)
        End If
    End Sub

    Private Sub btnUpdateFileNo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdateFileNo.Click
        'Kiểm tra xem giá trị thay đổi khác giá trị cũ không
        Dim fileNo As String = OrderNumIntegerInput.Value.ToString() + cmbOrderAlpha.Text.Trim()
        If _objFile IsNot Nothing Then
            If fileNo <> _objFile.FileNo Then
                If _objFileController.IsExistFileNo(_objFile.IsExport, fileNo) Then
                    MessageBox.Show(String.Format("FileNo {0} đã tồn tại. Vui lòng nhập giá trị khác", fileNo))
                    Exit Sub
                End If

                'Cập nhật lại FileNo và OrderNum
                _objFile.FileNo = fileNo
                _objFile.OrderNum = OrderNumIntegerInput.Value
                _objFile.OrderAlpha = cmbOrderAlpha.Text.Trim()
                _objFileController.Update(_objFile)
                reflectionLabelFileNo.Text = FormatFileNo(_objFile.FileNo.ToString())

                'Cập nhật lại title hiển thị theo FileNo
                _ucFile.ObjFile = _objFile
                _ucFile.UpdateTitle()
            End If
        Else
            reflectionLabelFileNo.Text = FormatFileNo(fileNo)
        End If
        LinkLabelEditFileNo_LinkClicked(Nothing, Nothing)
    End Sub

End Class
